package chapter06

/**
  * Scala接口的介绍：
  *
  * 从面向对象来看，接口并不属于面向对象的范畴，Scala是纯面向对象的语言，在Scala中，没有接口。
  * ==Scala语言中，采用特质trait（特征）来代替接口的概念，也就是说，多个类具有相同的特征（特征）时，就可以将这个特质（特征）独立出来，
  * 采用关键字trait声明。 理解trait 等价于(interface + abstract class)==
  * Scala提供了特质（trait），特质可以同时拥有抽象方法和具体方法，一个类可以实现/继承多个特质
  */
object Test13_Trait {

  def main(args: Array[String]): Unit = {
    val student13 = new Student13
    student13.dating()
    student13.sayHello()
    student13.study()
    student13.play()

    // 动态混入
    val student1 = new Student13 with Talent {
      override def dancing(): Unit = {
        println(s"student is $name dancing")
      }
    }
    student1.dancing()
  }
}


class Person13 {

  val name: String = "person"
  var age: Int = 18

  def sayHello(): Unit = {
    println(s"hello from:$name")
  }
}
// 定义一个特质
trait Young {
  // 定义抽象和非抽象属性
  var age:Int
  val name:String ="young"


  //声明抽象和非抽象方法

  def play(): Unit ={
    println(s"young people $name is playing")
  }

  def dating():Unit

}


class Student13 extends Person13 with Young{
  // 重写冲突的属性
  override val name: String = "student"

  override def dating(): Unit = println(s"student $name is dating")

  def study(): Unit = println(s"student $name is study")

  override def sayHello(): Unit = {
    super.sayHello()
    println(s"hello from :student:$name")

  }
}


trait Talent{
  def dancing():Unit
}
